# 🛰️ BaseViewSet - Vue générique pour Django REST Framework Ce `BaseViewSet` fournit une base stable, réutilisable et extensible pour construire des APIs Django REST prêtes à la consommation par un frontend VueJS. Il suit les **règles de codage NASA**, le **principe DRY** et une logique orientée scalabilité et sécurité. --- ## 🚀 Fonctionnalités clés - 🔁 **Filtrage dynamique** par URL (`restaurant_pk`, `menu_pk`, etc.) - 🔍 **Recherche avancée** via endpoint `/search/` sur les champs définis - 📄 **Schéma JSON automatique** pour le frontend (`/schema`) - ✅ **Création avec clés étrangères automatiques** - 🔐 **Robuste et sécurisé** (validations strictes, erreurs explicites) - 📦 **Pagination conditionnelle** (`?pagination=false` pour désactiver) --- ## 🔧 Utilisation ### 1. Héritez de `BaseViewSet` ```python class ProductViewSet(BaseViewSet): model = Product serializer_class = ProductSerializer queryset = Product.objects.all() filter_mapping = { 'restaurant_pk': 'restaurant_id', 'category_pk': 'category_id', } extra_search_fields = ['name', 'description'] ``` --- ### 2. Exemple de route ```python router.register( r'restaurants/(?P[^/.]+)/products', ProductViewSet, basename='restaurant-products' ) ``` --- ## 📡 Endpoints disponibles ### `/schema/` Renvoie automatiquement une description des champs disponibles dans le serializer, utile pour le frontend. ### `/search/` Effectue une recherche textuelle basée sur les champs définis dans `extra_search_fields`. #### Exemples : ``` GET /api/pei/search/?search=hydrant GET /api/suivie_pei/search/?search=2024&pagination=false ``` --- ## 📁 Extension Vous pouvez surcharger : - `get_additional_filters()` : pour ajouter des filtres personnalisés, - `filter_mapping` : pour mapper les paramètres d’URL aux champs, - `extra_search_fields` : pour autoriser d’autres champs dans la recherche. --- ## 🧠 Bonnes pratiques - Déclarez toujours `model` et `serializer_class` dans vos ViewSets enfants. - Utilisez des `filter_mapping` cohérents avec votre schéma de données. - Gardez vos modèles simples, vos serializers explicites. --- ## 📜 Licence MIT — Réutilisable dans tous vos projets pro/perso.